package in.lib.adapter.base; import in.lib.holder.base.ViewHolder; import in.lib.manager.SettingsManager; import in.lib.utils.ViewUtils; import in.lib.view.HeadedListView; import in.lib.view.ResizableTextView; import in.model.Stream; import in.model.base.NetObject; import in.obj.StreamMarker; import in.rob.client.R; import java.util.ArrayList; import java.util.Collections; import java.util.List; import lombok.Getter; import lombok.Setter; import android.content.Context; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.AbsListView; import android.widget.AbsListView.RecyclerListener; import android.widget.AdapterView; import android.widget.AdapterView.OnItemLongClickListener; import android.widget.BaseAdapter; import android.widget.ListView; public class RobinAdapter extends BaseAdapter implements OnClickListener, OnItemLongClickListener, HeadedListView.OnScrollListener { public enum Order { ASC, DESC }; @Getter private volatile Stream stream; private final LayoutInflater mLayoutInflater; private Order order = Order.ASC; private HeadedListView mListView; @Setter protected OnPagerListener onPagerListener; @Getter @Setter private int pageCount = SettingsManager.getPageSize(); @Getter @Setter private boolean animationsEnabled = true; @Getter @Setter private int lastPositionAnimated = 5; public static abstract class OnPagerListener { public abstract void endReached(); public void onBreakClicked(NetObject v){} } public RobinAdapter(Context context, Stream stream) { this.stream = stream; mLayoutInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } public RobinAdapter(Context context, Stream stream, Order order) { this.order = order; this.stream = stream; setItems(stream.getObjects()); mLayoutInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } public RobinAdapter(Context context, List<? extends NetObject> items) { stream = new Stream(); stream.getObjects().addAll(items); mLayoutInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } public RobinAdapter(Context context, List<? extends NetObject> items, Order order) { stream = new Stream(); this.order = order; setItems(items); mLayoutInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } public void refreshFontSizes() { List<View> views = new ArrayList<View>(); getListView().reclaimViews(views); if (views != null && views.size() > 0) { for (View v : views) { List<View> children = ViewUtils.getAllChildrenByInstance((ViewGroup)v, ResizableTextView.class); if (children != null && children.size() > 0) { for (View c : children) { ((ResizableTextView)c).refresh(); } } } } } public void setStream(Stream s) { if (s != null) { stream = s; } } public void setStreamMarker(StreamMarker m) { stream.setMarker(m); } public StreamMarker getStreamMarker() { return stream.getMarker(); } public void setHasMore(boolean more) { stream.setHasMore(more); } public String getLastId() { return stream.getMinId(); } public String getFirstId() { return stream.getMaxId(); } public int getBreakPosition() { return stream.getBreakPosition(); } public void setBreakPosition(int pos) { stream.setBreakPosition(pos); } public void setLastId(String id) { stream.setMinId(id); } public void setFirstId(String id) { stream.setMaxId(id); } public ListView getListView() { return mListView; } /** * @return The current set layout inflater */ public LayoutInflater getLayoutInflater() { return mLayoutInflater; } /** * @return The number of items in the current list */ @Override public int getCount() { return stream.getObjects().size(); } /** * @param position The position to fetch * @return The item object at the position */ @Override public NetObject getItem(int position) { if (stream.getObjects().size() <= position) { return null; } return stream.getObjects().get(position); } /** * Gets an item from it's ID * @param id the ID to search for * @return The object, or null */ public NetObject getItemById(String id) { for (NetObject obj : stream.getObjects()) { if (obj.getId().equals(id)) { return obj; } } return null; } /** * @return The list of items */ public List<NetObject> getItems() { return stream.getObjects(); } /** * @param position The position to of the object to fetch * @return The id of the fetched object */ public String getId(int position) { return stream.getObjects().get(position).getId(); } @Override public View getView(int position, View convertView, ViewGroup parent) { if (onPagerListener != null) { int trigger = getCount() - (getPageCount() / 2); if (trigger >= getPageCount() / 2 && position >= trigger) { onPagerListener.endReached(); } } return null; } @Override public long getItemId(int position) { try { return Long.parseLong(getItem(position).getId()); } catch (Exception e) { return -1; } } /** * @param order The new order of the list, Either Order.ASC or Order.DESC */ public void setOrder(Order order) { this.order = order; } /** * @param list The new list view in the adapter */ public void setListView(HeadedListView list) { mListView = list; if (list != null) { list.setOnItemLongClickListener(this); list.addOnScrollListener(this); list.setRecyclerListener(new RecyclerListener() { @Override public void onMovedToScrapHeap(View view) { Object tag = view.getTag(R.id.TAG_VIEW_HOLDER); if (tag instanceof ViewHolder) { ViewHolder holder = (ViewHolder)tag; holder.onViewDestroyed(view); } } }); } } /** * @param position The position to add the new item * @param item The item to add */ public void addItem(int position, NetObject item) { stream.getObjects().add(position, item); } /** * @param position The position to add the new item * @param items The items to add */ public void addItems(int position, List<? extends NetObject> items) { stream.getObjects().addAll(position, items); } /** * Adds a new item in the list based on the set Order * @param item Thew item to add */ public void addItem(NetObject item) { if (item == null) return; if (order.equals(Order.DESC)) { stream.getObjects().add(item); } else { stream.getObjects().add(0, item); } } /** * Adds items to the list based on the set Order * @param items The list of items to add */ public void addItems(List<? extends NetObject> items) { if (items == null) return; if (order.equals(Order.DESC)) { stream.getObjects().addAll(items); } else { Collections.reverse(items); stream.getObjects().addAll(0, items); } } /** * Removes an item from the adapter * @param item The item to remove */ public void removeItem(NetObject item) { stream.getObjects().remove(item); } /** * @param id The id of the item to remove */ public void removeItem(String id) { int size = stream.getObjects().size(); for (int index = 0; index < size; index++) { if (stream.getObjects().get(index).getId().equals(id)) { stream.getObjects().remove(index); break; } } } /** * Removes an item at the index * @param index The index to remove the item */ public void removeItemAt(int index) { stream.getObjects().remove(index); } /** * Adds items to the start of the list. Ignores the set Order * @param items The items to add */ public void prependItems(List<? extends NetObject> items) { stream.getObjects().addAll(0, items); } /** * Adds an item to the start of the list. Ignores the set Order * @param items The item to add */ public void prependItem(NetObject items) { stream.getObjects().add(0, items); } /** * Adds an item to the end of the list. Ignores the set Order * @param item The item to add */ public void appendItem(NetObject item) { stream.getObjects().add(item); } /** * Adds items to the end of the list. Ignores the set Order * @param item The items to add */ public void appendItem(List<? extends NetObject> item) { stream.getObjects().addAll(item); } /** * Clears the list and sets the new item set * @param items The items to add */ public void setItems(List<? extends NetObject> items) { stream.getObjects().clear(); addItems(items); } /** * Clears the list */ public void clear() { stream.getObjects().clear(); } /** * @param item The item to find * @return The postition of said new item */ public int indexOf(NetObject item) { return stream.getObjects().indexOf(item); } /** * @param item The ID of the item to find * @return The postition of said new item */ public int indexOf(String id) { for (int index = 0, size = stream.getObjects().size(); index < size; index++) { if (stream.getObjects().get(index).getId().equals(id)) { return index; } } return -1; } @Override public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { return false; } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount){} @Override public void onScrollStateChanged(AbsListView view, int scrollState){} @Override public void onClick(View v){} @Override public void onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY){} }